package online.longzipeng.mywebdemo.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;

/**
 * @author lzp
 * @Date:2023/3/1
 * @description: json处理工具类
 */
public class MyJsonUtils {

	/**
	 * 单例objectMapper，提高性能
	 * 网上的性能测试：https://blog.csdn.net/qq_31960623/article/details/117778291
	 */
	private static final ObjectMapper objectMapper = new ObjectMapper();

	/**
	 * 单例 饿汉式
	 */
	private static final MyJsonUtils INSTANCE = new MyJsonUtils();

	private MyJsonUtils() {
	}

	/**
	 * 单例模式，暴露一个单例的工具类实例获取
	 */
	public static MyJsonUtils getInstance() {
		return INSTANCE;
	}

	/**
	 * 通过key路径取到最后一级key对应的jsonNode
	 *
	 * @param jsonStr 原始的json字符串
	 * @param keyPath xx.xxx.xxx格式的key路径
	 * @return
	 */
	public JsonNode getValueByKeyPath(String jsonStr, String keyPath) throws JsonProcessingException {
		JsonNode jsonNode = objectMapper.readTree(jsonStr);
		// 自行写循环处理
//		String[] paths = keyPath.split("\\.");
//
//		// 遍历key路径，直到最后一层的key
//		JsonNode currentNode = jsonNode;
//		for (String key : paths) {
//			currentNode = currentNode.get(key);
//			if (currentNode == null) {
//				return null;
//			}
//		}

		// 使用 JsonNode.at处理
		if (!keyPath.startsWith("/")) {
			keyPath = "/" + keyPath;
		}
		keyPath = keyPath.replace(".", "/");
		return jsonNode.at(keyPath);
	}

	/**
	 * 通过key路径取到最后一级key对应的value值
	 *
	 * @param jsonStr 原始json字符串
	 * @param keyPath xx.xxx.xxx格式的key路径
	 * @param cls     值的对象类型
	 */
	public <T> T getValueByKeyPath(String jsonStr, String keyPath, Class<T> cls) throws JsonProcessingException {
		JsonNode jsonNode = this.getValueByKeyPath(jsonStr, keyPath);
		if (jsonNode == null) {
			return null;
		}
		return objectMapper.treeToValue(jsonNode, cls);
	}

	/**
	 * todo 可以用static进行修饰，改造成静态方法，这里我懒得重做了，大家可以自行改造一下
	 * @param <T>
	 * @return
	 */
	public static <T> T getValue() {
		return null;
	}

	/**
	 * 测试
	 */
	public static void main(String[] args) throws JsonProcessingException {
		String jsonStr = "{\"head\":{\"face\":\"隔壁老王的小脸\",\"eye\":{\"left\":\"轮回眼\",\"right\":\"写轮眼\"},\"iq\":250},\"body\":\"身材修长\",\"likeStudy\":true}";
		// 分别取到各个类型的值
		String valueStr = MyJsonUtils.getInstance().getValueByKeyPath(jsonStr, "head.eye.left", String.class);
		Integer valueInt = MyJsonUtils.getInstance().getValueByKeyPath(jsonStr, "head.iq", Integer.class);
		Boolean valueBool = MyJsonUtils.getInstance().getValueByKeyPath(jsonStr, "likeStudy", Boolean.class);
		System.out.println(valueStr);
		System.out.println(valueInt);
		System.out.println(valueBool);

		// jsonPath快速取值
		String str = JsonPath.read(jsonStr, "$.head.eye.left");
		System.out.println(str);

		// jsonNode.at方式取值
		JsonNode jsonNode = objectMapper.readTree(jsonStr);
		String str2 = jsonNode.at("/head/eye/left").textValue();
		System.out.println(str2);


	}

}
